package org.usmile.algorithms.leetcode.simple;

import org.usmile.algorithms.leetcode.TreeNode;

/**
 * 404. 左叶子之和
 *
 * 给定二叉树的根节点 root ，返回所有左叶子之和。
 *
 * 示例 1：
 * 输入: root = [3,9,20,null,null,15,7]
 * 输出: 24
 * 解释: 在这个二叉树中，有两个左叶子，分别是 9 和 15，所以返回 24
 *
 * 示例 2:
 * 输入: root = [1]
 * 输出: 0
 *
 * 提示:
 * 节点数在 [1, 1000] 范围内
 * -1000 <= Node.val <= 1000
 */
public class _0404 {
}

class _0404_Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root == null) {
            return 0;
        }

       return sumOfLeftLeaves(root, false);
    }

    private int sumOfLeftLeaves(TreeNode node, boolean isLeft) {
        if (node == null) {
            return 0;
        }

        if (isLeft && node.left == null && node.right == null) {
            return node.val;
        }

        return sumOfLeftLeaves(node.left, true) + sumOfLeftLeaves(node.right, false);
    }
}

class _0404_Solution1 {
    private int sum = 0;

    public int sumOfLeftLeaves(TreeNode root) {
        dfs(root);

        return sum;
    }

    private void dfs(TreeNode node) {
        if (node == null) {
            return;
        }

        if (node.left != null) {
            if (node.left.left == null && node.left.right == null) {
                sum += node.left.val;
            }
        }
        dfs(node.left);
        dfs(node.right);
    }
}
